package com.hc.java.file;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author huangchao E-mail:fengquan8866@163.com
 * @version 创建时间：2024/5/9 13:01
 */
public class 大文件分割 {
    public static void main(String[] args) throws IOException {
        String filePath = "E:\\user_home\\CentOS7_13.zip";
        String outputDir = "D:\\tmp\\备份";
        splitFile(filePath, outputDir);
    }

    private static void splitFile(String filePath, String outputDir) throws IOException {
        long maxFileSize = 1024 * 1024 * 1024L; // 每个输出文件的最大大小（1GB）
        File file = new File(outputDir);
        if (!file.exists()) {
            file.mkdirs();
        }
        splitFile(filePath, outputDir, maxFileSize);
    }

    /**
     * 文件分割
     * 分割后文件名格式： 原文件名.${num}.fm  num-从0开始增加
     *
     * @param filePath    源文件路径
     * @param outputDir   输出目录
     * @param maxFileSize 分割文件大小，默认1G
     * @throws IOException
     */
    private static void splitFile(String filePath, String outputDir, long maxFileSize) throws IOException {
        long start = System.currentTimeMillis();
        File f = new File(filePath);
        String name = f.getName().substring(0, f.getName().lastIndexOf("."));
        // 使用FileInputStream打开大文件
        FileInputStream fis = new FileInputStream(f);
        // 获取大文件的大小
//        long fileSize = fis.available();
        long fileSize = f.length();
        // 设定每个分割文件的大小
        int numSplits = (int) Math.ceil((double) fileSize / maxFileSize);
        // 循环分割文件
        for (int i = 0; i < numSplits; i++) {
            long outputFileSize = 0;
            int splitSize = 1024 * 1024; // 1M
            // 创建输出流
            FileOutputStream fos = new FileOutputStream(outputDir + "\\" + name + '.' + i + ".fm");
            int bytesRead;
            byte[] buffer = new byte[splitSize];
            while ((bytesRead = fis.read(buffer)) != -1) {
                // 写入分割文件
                fos.write(buffer, 0, bytesRead);
                outputFileSize += bytesRead;
                if (outputFileSize >= maxFileSize) {
                    break;
                }
            }
            fos.close();
        }
        fis.close();
        long end = System.currentTimeMillis();
        System.out.println("Split file completed. " + (end - start));
    }
}
